/**
 * gislin
 * 2016年3月24日
 */
package io.chance.receiverlei.db;

import lrq.data.DataTable;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

/**
 * redis工具类，封装对设备在线信息的存取
 *
 * @author gislin
 * 2016年3月24日
 */
public class RedisHelperBak {

    private static RedisHelperBak _instance;
    private static ThreadLocal<SimpleDateFormat> defaultSf = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
    private static ThreadLocal<SimpleDateFormat> dataTimeSf = ThreadLocal.withInitial(() -> new SimpleDateFormat("yyyyMMddHHmmss"));
//    static SimpleDateFormat defaultSf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//    static SimpleDateFormat dataTimeSf = new SimpleDateFormat("yyyyMMddHHmmss");

    private RedisHelperBak() {

    }

    public static RedisHelperBak getInstance() {
        if (_instance == null) {
            _instance = new RedisHelperBak();
        }
        return _instance;
    }

    /**
     * 根据设备编号获取channelid
     * gislin
     * 2016年3月24日
     *
     * @param mn
     * @return
     */
    public String getChannelId(String mn) {
        String channelId = RedisDbExecute.getString("stationInfo:" + mn + ":deviceInfo:channelId");
        return channelId;
    }

    /**
     * 跟channelid获取设备编号
     * gislin
     * 2016年3月24日
     *
     * @param channelId
     * @return
     */
    public String getMn(String channelId) {
        String mn = RedisDbExecute.getString("channelInfo:" + channelId + ":mn");
        return mn;
    }

    /**
     * 在redis中注册设备和channel信息
     * gislin
     * 2016年3月24日
     *
     * @param mn
     * @param channelId
     */
    public void addDevice(String mn, String channelId) {
        if (mn != null) {
            RedisDbExecute.setString("stationInfo:" + mn + ":deviceInfo:channelId", channelId);
            RedisDbExecute.setString("channelInfo:" + channelId + ":mn", mn);
        }
        else {
            RedisDbExecute.setString("channelInfo:" + channelId + ":mn", "null");
        }
    }

    /**
     * 获取所有设备编号
     * gislin
     * 2016年3月24日
     *
     * @return
     */
    public List<String> getDevices() {
        Set<String> devices = RedisDbExecute.queryKeys("stationInfo:*:deviceInfo:channelId");
        List<String> mns = new ArrayList<String>();
        for (String key : devices) {
            String mn = key.split(":")[1];
            mns.add(mn);
        }
        return mns;
    }

    /**
     * 获取所有的channelid
     * gislin
     * 2016年3月24日
     *
     * @return
     */
    public List<String> getChannelid() {
        Set<String> channelidSet = RedisDbExecute.queryKeys("channelInfo:*:mn");
        List<String> channelids = new ArrayList<String>();
        for (String key : channelidSet) {
            String channelid = key.split(":")[1];
            channelids.add(channelid);
        }
        return channelids;
    }

    /**
     * 移除channelid
     * gislin
     * 2016年3月24日
     *
     * @param channelId
     */
    public void deleteChannel(String channelId) {
        RedisDbExecute.deleteKeys("channelInfo:" + channelId + "*");
    }

    /**
     * 移除设备
     * gislin
     * 2016年3月25日
     *
     * @param mn
     */
    public void deleteDevice(String mn) {
        RedisDbExecute.deleteKeys("stationInfo:" + mn + ":deviceInfo:activityTime");
        RedisDbExecute.deleteKeys("stationInfo:" + mn + ":deviceInfo:channelId");
    }

    public void setDeviceActivityTime(String mn) {
        RedisDbExecute.setString("stationInfo:" + mn + ":deviceInfo:activityTime", defaultSf.get().format(new Date()));
    }

    /**
     * 设置当前设备的数据时间
     * gislin
     * 2016年5月12日
     *
     * @param mn
     */
    public void setDeviceDataTime(String mn) {
        RedisDbExecute.setString("stationInfo:" + mn + ":deviceInfo:DataTime", dataTimeSf.get().format(new Date()));
    }

    /**
     * 设置参数测量值
     * gislin
     * 2016年4月15日
     *
     * @param mn       设备编号
     * @param pollName 污染物名称
     * @param value    测量值
     */
    public void setPollValue(String mn, String pollName, String value) {
        RedisDbExecute.setString("stationInfo:" + mn + ":deviceInfo:" + pollName + "_MEAS", value);
    }

    /**
     * 设置系统状态值
     * gislin
     * 2016年4月15日
     *
     * @param mn
     * @param statusName 状态名称
     * @param value
     */
    public void setSysStatusValue(String mn, String statusName, String value) {
        RedisDbExecute.setString("stationInfo:" + mn + ":sysStatus:" + statusName, value);
    }

    /**
     * 获取系统状态值
     * gislin
     * 2016年4月16日
     *
     * @param mn
     * @param statusName
     * @return
     */
    public String getSysStatusValue(String mn, String statusName) {
        String value = RedisDbExecute.getString("stationInfo:" + mn + ":sysStatus:" + statusName);
        return value;
    }

    /**
     * 获取设备最后活动时间
     * gislin
     * 2016年3月24日
     *
     * @param mn
     * @return
     */
    public Date getDeviceActivityTime(String mn) {
        Date date = RedisDbExecute.getDate("stationInfo:" + mn + ":deviceInfo:activityTime", null);
        return date;
    }

    /**
     * 初始化量程信息
     * gislin
     * 2016年5月10日
     */
    public void initLc() {
//        String lcSql = "select dc.device_num,ABNORMAL_MIN,ABNORMAL_MAX,sp.NAME from site_pollutants sp\n" +
//            "       inner join monitor_equipment me on me.guid = sp.device_id\n" +
//            "       inner join data_collection_instrumet dc on dc.site_id = me.monitor_point\n";
        String lcSql = "select sp.poll_code NAME,sp.DETECTION_DOWN ABNORMAL_MIN,sp.DETECTION_UP ABNORMAL_MAX,ms.SITE_ID DEVICE_NUM from D_BC_SITE_POLL sp\n" +
            "       left join D_BC_SITE ms on sp.site_id = ms.ID\n" ;
        DataTable table;
        try {
            table = DbManager.getDbExecuter().executeQuery(lcSql);
            for (int i = 0; i < table.getRecordCount(); i++) {
                Object mino = table.getValue(i, "ABNORMAL_MIN");
                Object maxo = table.getValue(i, "ABNORMAL_MAX");
                Object name = table.getValue(i, "NAME");
                String mn = table.getString(i, "DEVICE_NUM");

                if (mino != null && maxo != null && mn != null && name != null) {
                    Double min = table.getDouble(i, "ABNORMAL_MIN");
                    Double max = table.getDouble(i, "ABNORMAL_MAX");
                    RedisDbExecute.setString("sysDict:lc:" + mn + ":" + name + ":max", max + "");
                    RedisDbExecute.setString("sysDict:lc:" + mn + ":" + name + ":min", min + "");
                    RedisDbExecute.setString("sysDict:lc:default:" + name + ":max", max + "");
                    RedisDbExecute.setString("sysDict:lc:default:" + name + ":min", min + "");
                }
            }
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取最大量程
     * gislin
     * 2016年5月10日
     *
     * @param mn
     * @param pollCode
     * @return
     */
    public Double getMaxLc(String mn, String pollCode) {
        Double lc = RedisDbExecute.getDouble("sysDict:lc:" + mn + ":" + pollCode + ":max");
        if (lc == null) {
            lc = RedisDbExecute.getDouble("sysDict:lc:default:" + pollCode + ":max");
        }
        if (lc == null) {
            initLc();
            lc = RedisDbExecute.getDouble("sysDict:lc:default:" + pollCode + ":max");
        }
        return lc;
    }

    /**
     * 获取最小量程
     * gislin
     * 2016年5月10日
     *
     * @param mn
     * @param pollCode
     * @return
     */
    public Double getMinLc(String mn, String pollCode) {
        Double lc = RedisDbExecute.getDouble("sysDict:lc:" + mn + ":" + pollCode + ":min");
        if (lc == null) {
            lc = RedisDbExecute.getDouble("sysDict:lc:default:" + pollCode + ":min");
        }
        if (lc == null) {
            initLc();
            lc = RedisDbExecute.getDouble("sysDict:lc:default:" + pollCode + ":min");
        }
        return lc;
    }
}
